<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用闭包</title>
    <script>
        /**
         * 将函数作为另一个函数的返回值
         */
        function fun1() {
            var a = 2
            function fun2() {
                a++
                console.log(a)
            }
            return fun2
        }
        
        // 整个过程创建闭包1个，创建（非执行）几个内部函数对象就是创建几个闭包
        var f = fun1() //因为闭包的存在，fun1执行后，变量a仍然存在
        f(); //3
        f(); //4
        f = null; //闭包被销毁，因为包含闭包的函数成为了垃圾对象
        
        (fun1())();
        (fun1())();


        /**
         * 将函数作为实参，传递给另一个函数
         */
        function showDelay(msg, time) {
            setTimeout(function () {
                alert(msg)
            }, time)
        }
        
        showDelay('message', 3000)

    </script>
</head>
<body>
闭包使得函数执行完成后，变量仍然存活在内存中，延长了局部变量的生命周期
让函数外部可以操作函数内部的变量和函数

闭包创建于嵌套内部函数定义完成时，在嵌套的内部函数成为垃圾对象时销毁
</body>
</html>
